#!/bin/bash

# 默认配置文件路径
#CONFIG_FILE="/etc/snort_iptables_config.conf"

# 默认iptables命令路径
IPTABLES_CMD="/sbin/iptables"

# 默认Snort警报日志路径
SNORT_ALERT_LOG="/var/log/snort/alert"

# 默认网络接口
INTERFACE="ens33"

# 加载配置文件
if [ -f "$CONFIG_FILE" ]; then
    source "$CONFIG_FILE"
fi

# 监视Snort警报日志
echo "————————————————联合Snort的入侵防御系统开始检测————————"
echo "——————————————————————————by：史弘慧——————————————————"
echo "—————项目地址：https://gitee.com/szrszr/snort-to-iptables.git——————"
tail -n 0 -F "$SNORT_ALERT_LOG" | while read line
do
    # 解析警报内容，提取源IP地址
    source_ip=$(echo "$line" | awk '{match($0, /([0-9]{1,3}\.){3}[0-9]{1,3}/); if (RSTART > 0) print substr($0, RSTART, RLENGTH)}')
    if [ -n "$source_ip" ]; then
        local_ips=$(ifconfig | grep 'inet ' | awk '{print $2}' | cut -d: -f2)  
        if echo "$local_ips" | grep -qFx "$source_ip"; then  
            #echo "source_ip 是本机 IP 地址" 
            continue 
        else  
            #echo "source_ip 不是本机 IP 地址" 
            # 添加iptables规则阻止来自源IP地址的流量
            #检查iptables规则是否已存在
            iptables-save | grep -q -- "-A INPUT -s $source_ip/32 -i $INTERFACE -j DROP"
            if [ $? -eq 0 ]; then
                echo "$(date)，已【阻挡】来自$source_ip的持续攻击"
                continue
            else
                # 如果规则不存在，则添加iptables规则阻止来自源IP地址的流量
                $IPTABLES_CMD -A INPUT -s "$source_ip" -i "$INTERFACE" -j DROP
                # 记录日志
                # echo "Blocked traffic from $source_ip at $(date)" >> /var/log/snort_iptables_block.log
                echo " $(date)，已添加 【-A INPUT -s "$source_ip" -i "$INTERFACE" -j DROP】规则"
            fi
        fi
    else
        #echo "source_ip 为空，跳过处理"
        continue
    fi
  
done
# 添加退出机制，捕获终止信号并执行清理操作
trap 'echo "程序退出..."; exit 0' SIGINT SIGTERM